﻿using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Controllers;
using Interfaces;
using Utilities;

namespace Views.Moduler
{
    public partial class Mobiler : UserControl
    {

        #region Fields

        private readonly Controller _controller;
        private IMobil _selectedMobil;

        #endregion

        #region Creation

        public Mobiler(Controller controller)
        {
            InitializeComponent();
            _controller = controller;

            OpdaterSide();
        }

        #endregion

        #region Event Handlers

        private void BtnSletEnhed_Click(object sender, RoutedEventArgs e)
        {
            var mobilEnhed = LwEnheder.SelectedItem as IMobil;

            if (mobilEnhed == null) return;

            _selectedMobil = mobilEnhed;

            var result = MessageBox.Show(
                "Er du sikker på at du vil slette enheden: " + _selectedMobil.Navn + "? Hvis der er tilknyttet nogle udlån vil de blive slettet fra systemet.",
                "Er du sikker?", MessageBoxButton.YesNo, MessageBoxImage.Exclamation);

            if (result == MessageBoxResult.No) return;

            _controller.FjernMobilEnhed(_selectedMobil);

            OpdaterSide();
        }

        private void LwEnhed_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var mobilEnhed = LwEnheder.SelectedItem as IMobil;

            if (mobilEnhed == null) return;

            _selectedMobil = mobilEnhed;

            EnhedValgt();

            OpdaterMobilSpecifikationer();
        }

        private void BtnRedigerEnhed_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedMobil != null)
            {
                var formular = new Form();
                formular.BtnSubmit = "Opdater";
                formular.Title = "Opdater " + _selectedMobil.Navn;

                formular.CreateTextBox("navn", "Mobilens navn:", _selectedMobil.Navn, true);
                formular.CreateIntegerBox("mobilNummer", "Mobil Nr:", _selectedMobil.MobilNummer);
                formular.CreateIntegerBox("imeiNummer", "IMEI Nr:", _selectedMobil.ImeiNummer);

                var window = new FormWindow(formular);
                if (window.ShowDialog() == true)
                {
                    string navn = (string)formular.Result["navn"];
                    string mobilNummer = (string)formular.Result["mobilNummer"];
                    string imeiNummer = (string)formular.Result["imeiNummer"];

                    if (navn.IsValidStringAndHasMaxLengthOf(25) &&
                        mobilNummer.IsValidStringAndHasMaxLengthOf(8) &&
                        imeiNummer.IsMaxLength(15))
                    {
                        bool opdateret = _controller.OpdaterMobilEnhed(_selectedMobil, navn, mobilNummer, imeiNummer);
                        if (opdateret)
                        {
                            OpdaterMobilEnhedsListView();
                            OpdaterMobilSpecifikationer();
                        }
                        else
                        {
                            MessageBox.Show("Der skete en fejl. Det kunne være fordi du har opdateret antallet, " +
                                            "til et tal der er mindre end mængden af udlån på denne enhed.",
                                            "Fejl",
                                            MessageBoxButton.OK,
                                            MessageBoxImage.Error);
                        }
                    }
                    else
                    {
                        string validationError = "";

                        if (!navn.IsValidString())
                            validationError += "Du skal udfylde enhedens navn. ";
                        else
                            if (!navn.IsValidStringAndHasMaxLengthOf(25))
                                validationError += "Enhedens navn må maks være 25 tegn. ";

                        if (!mobilNummer.IsValidStringAndHasMaxLengthOf(25))
                            validationError += "CPU må maks være 25 tegn. ";

                        if (!imeiNummer.IsMaxLength(15))
                            validationError += "IMEI nummeret må maks være 15 tegn. ";


                        if (!validationError.IsValidString()) return;

                        MessageBox.Show(validationError);
                    }
                }
            }
        }

        private void BtnOpretEnhed_Click(object sender, RoutedEventArgs e)
        {
            var oprettelsesDato = DateTime.Now;
            int antal = 1;
            var formular = new Form();
            formular.BtnSubmit = "Tilføj mobil";
            formular.Title = "Tilføj ny mobil";

            formular.CreateTextBox("navn", "Mobilens navn:");
            formular.CreateIntegerBox("mobilNummer", "Mobil Nr:");
            formular.CreateIntegerBox("imeiNummer", "IMEI Nr:");

            var formWindow = new FormWindow(formular);

            // hvis formularen blev submitted
            if (formWindow.ShowDialog() == true)
            {
                string navn = (string)formular.Result["navn"];
                string mobilNummer = (string)formular.Result["mobilNummer"];
                string imeiNummer = (string)formular.Result["imeiNummer"];

                if (navn.IsValidString())
                {
                    bool oprettet = _controller.OpretMobilEnhed(navn, antal, oprettelsesDato, mobilNummer, imeiNummer);
                    if (oprettet)
                    {
                        OpdaterMobilEnhedsListView();
                    }
                    else if (_controller.TjekMobilNummer(mobilNummer))
                    {
                        MessageBox.Show("Mobilnummer " + mobilNummer + ", findes i forvejen",
                                            "Fejl",
                                            MessageBoxButton.OK,
                                            MessageBoxImage.Error);
                        OpretEnhedMobilNr(sender, e, navn, mobilNummer, imeiNummer);
                    }
                    else if (_controller.TjekImeiNummer(imeiNummer))
                    {
                        MessageBox.Show("Imeinummer " + imeiNummer + ", findes i forvejen",
                                            "Fejl",
                                            MessageBoxButton.OK,
                                            MessageBoxImage.Error);
                        OpretEnhedImeiNr(sender, e, navn, mobilNummer, imeiNummer);
                    }
                }
            }
        }

        private void OpretEnhedMobilNr(object sender, RoutedEventArgs e, string mobilNavn, string mobilNr, string imeiNr)
        {
            var oprettelsesDato = DateTime.Now;
            int antal = 1;
            var formular = new Form();
            formular.BtnSubmit = "Tilføj mobil";
            formular.Title = "Tilføj ny mobil";

            formular.CreateTextBox("navn", "Mobilens navn:", mobilNavn);
            formular.CreateIntegerBox("mobilNummer", "Mobil Nr:", mobilNr, true);
            formular.CreateIntegerBox("imeiNummer", "IMEI Nr:", imeiNr);

            var formWindow = new FormWindow(formular);

            // hvis formularen blev submitted
            if (formWindow.ShowDialog() == true)
            {
                string navn = (string)formular.Result["navn"];
                string mobilNummer = (string)formular.Result["mobilNummer"];
                string imeiNummer = (string)formular.Result["imeiNummer"];

                if (navn.IsValidString())
                {
                    bool oprettet = _controller.OpretMobilEnhed(navn, antal, oprettelsesDato, mobilNummer, imeiNummer);
                    if (oprettet)
                    {
                        OpdaterMobilEnhedsListView();
                    }
                    else if (_controller.TjekMobilNummer(mobilNummer))
                    {
                        MessageBox.Show("Mobilnummer " + mobilNummer + ", findes i forvejen",
                                            "Fejl",
                                            MessageBoxButton.OK,
                                            MessageBoxImage.Error);
                        OpretEnhedMobilNr(sender, e, navn, mobilNummer, imeiNummer);
                    }
                    else if (_controller.TjekImeiNummer(imeiNummer))
                    {
                        MessageBox.Show("Imeinummer " + imeiNummer + ", findes i forvejen",
                                            "Fejl",
                                            MessageBoxButton.OK,
                                            MessageBoxImage.Error);
                        OpretEnhedImeiNr(sender, e, navn, mobilNummer, imeiNummer);
                    }
                }
            }
        }

        private void OpretEnhedImeiNr(object sender, RoutedEventArgs e, string mobilNavn, string mobilNr, string imeiNr)
        {
            DateTime oprettelsesDato = DateTime.Now;
            const int antal = 1;
            var formular = new Form();
            formular.BtnSubmit = "Tilføj mobil";
            formular.Title = "Tilføj ny mobil";

            formular.CreateTextBox("navn", "Mobilens navn:", mobilNavn);
            formular.CreateIntegerBox("mobilNummer", "Mobil Nr:", mobilNr);
            formular.CreateIntegerBox("imeiNummer", "IMEI Nr:", imeiNr, true);

            var formWindow = new FormWindow(formular);

            // hvis formularen blev submitted
            if (formWindow.ShowDialog() == true)
            {
                string navn = (string)formular.Result["navn"];
                string mobilNummer = (string)formular.Result["mobilNummer"];
                string imeiNummer = (string)formular.Result["imeiNummer"];

                if (navn.IsValidString())
                {
                    bool oprettet = _controller.OpretMobilEnhed(navn, antal, oprettelsesDato, mobilNummer, imeiNummer);
                    if (oprettet)
                    {
                        OpdaterMobilEnhedsListView();
                    }
                    else if (_controller.TjekMobilNummer(mobilNummer))
                    {
                        MessageBox.Show("Mobilnummer " + mobilNummer + ", findes i forvejen",
                                            "Fejl",
                                            MessageBoxButton.OK,
                                            MessageBoxImage.Error);
                        OpretEnhedMobilNr(sender, e, navn, mobilNummer, imeiNummer);
                    }
                    else if (_controller.TjekImeiNummer(imeiNummer))
                    {
                        MessageBox.Show("Imeinummer " + imeiNummer + ", findes i forvejen",
                                            "Fejl",
                                            MessageBoxButton.OK,
                                            MessageBoxImage.Error);
                        OpretEnhedImeiNr(sender, e, navn, mobilNummer, imeiNummer);
                    }
                }
            }
        }

        private void ListViewEnheder_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (_selectedMobil == null) return;

            VisRedigerWindow();
        }

        private void MenuItemVisUdlån_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedMobil == null) return;

            VisRedigerWindow();
        }

        private void BtnVisHistorik_Click(object sender, RoutedEventArgs e)
        {
            if (_selectedMobil == null) return;

            var window = new EnhedsHistorik(_controller, _selectedMobil);
            window.ShowDialog();
        }

        #endregion

        #region Tilstandsstyring

        public void OpdaterSide()
        {
            LwEnheder.SelectedItem = null;
            _selectedMobil = null;
            BtnVisHistorik.IsEnabled = false;
            BtnVisUdlån.IsEnabled = false;
            BtnRediger.IsEnabled = false;
            BtnSletEnhed.IsEnabled = false;
            OpdaterMobilEnhedsListView();
            OpdaterMobilSpecifikationer();
            SkjulMobilSpecifikationer();
        }

        public void OpdaterMobilSpecifikationer()
        {
            if (_selectedMobil != null)
            {
                string unit;

                unit = _selectedMobil.MobilNummer;
                if (unit != "")
                {
                    TxtMobilNummer.Text = unit;
                    StackMobilNummer.Visibility = Visibility.Visible;
                }
                else StackMobilNummer.Visibility = Visibility.Collapsed;

                unit = _selectedMobil.ImeiNummer;
                if (unit != "")
                {
                    TxtImeiNummer.Text = unit;
                    StackImeiNummer.Visibility = Visibility.Visible;
                }
                else StackImeiNummer.Visibility = Visibility.Collapsed;
            }
            else
            {
                TxtMobilNummer.Clear();
                TxtImeiNummer.Clear();
            }
        }

        public void SkjulMobilSpecifikationer()
        {
            StackMobilNummer.Visibility = Visibility.Collapsed;
            StackImeiNummer.Visibility = Visibility.Collapsed;
        }

        public void OpdaterMobilEnhedsListView()
        {
            LwEnheder.ItemsSource = _controller.HentAlleMobileEnheder();
        }

        public void VisRedigerWindow()
        {
            if (_selectedMobil == null) return;

            var brugerDiverse = new MobilUdlån(_controller, _selectedMobil, this);
            if (brugerDiverse.ShowDialog() == true)
            {
                this.OpdaterSide();
            }
        }

        public void EnhedValgt()
        {
            BtnRediger.IsEnabled = true;
            BtnSletEnhed.IsEnabled = true;
            BtnVisHistorik.IsEnabled = true;
            BtnVisUdlån.IsEnabled = true;
            BtnVisUdlån.IsDefault = true;
        }

        #endregion
    }
}